﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using Kyoh.Lib.Win32API;

namespace Kyoh.Lib.WinForms
{
    /// <summary>ハンドルにより取得されたアイコン画像を管理します。</summary>
    public partial class IconManager : System.ComponentModel.Component
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private readonly System.ComponentModel.IContainer components = null;

        private readonly Dictionary<IntPtr, Image> _icons = new Dictionary<IntPtr, Image>(); 
        /// <summary><see cref="IconManager"/> の新しいインスタンスを初期化します。</summary>
        public IconManager()
        {
            components = new System.ComponentModel.Container();
        }
        
        /// <summary><see cref="IconManager"/> の新しいインスタンスを初期化します。</summary>
        /// <param name="container">コンテナオブジェクト。</param>
        public IconManager(IContainer container)
        {
            container.Add(this);

            components = new System.ComponentModel.Container();
        }

        /// <summary>指定されたハンドラからアイコンを取得します。</summary>
        /// <param name="hIcon">取得するアイコンのハンドラ。</param>
        /// <returns>取得したアイコンの <see cref="Image"/>。</returns>
        public Image GetIcon(IntPtr hIcon)
        {
            if (!_icons.ContainsKey(hIcon))
            {
                using (var icon = Icon.FromHandle(hIcon))
                    _icons.Add(hIcon, icon.ToBitmap());
            }
            return _icons[hIcon];
        }

        /// <summary> 
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            foreach (var icon in _icons)
            {
                if (icon.Key != IntPtr.Zero)
                    NativeMethods.DestroyIcon(icon.Key);
                if (disposing && icon.Value != null)
                    icon.Value.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
